package org.dxy.infrastructure.util;

import lombok.extern.slf4j.Slf4j;

/**
 * 用户上下文工具类
 * 使用ThreadLocal存储当前用户信息，确保线程安全
 * 
 * @author dxy
 * @createTime 2025/8/5 10:35
 */
@Slf4j
public class UserContext {

    /**
     * 用户信息ThreadLocal
     */
    private static final ThreadLocal<String> USER_THREAD_LOCAL = new ThreadLocal<>();

    /**
     * 设置当前用户
     * 
     * @param userId 用户ID
     */
    public static void setCurrentUser(String userId) {
        if (userId != null) {
            USER_THREAD_LOCAL.set(userId);
            log.debug("设置当前用户: {}", userId);
        }
    }

    /**
     * 获取当前用户
     * 
     * @return 当前用户ID，如果未设置则返回"system"
     */
    public static String getCurrentUser() {
        String userId = USER_THREAD_LOCAL.get();
        return userId != null ? userId : "system";
    }

    /**
     * 清除当前用户信息
     * 注意：在请求结束时必须调用此方法，避免内存泄漏
     */
    public static void clear() {
        String userId = USER_THREAD_LOCAL.get();
        if (userId != null) {
            log.debug("清除当前用户: {}", userId);
            USER_THREAD_LOCAL.remove();
        }
    }

    /**
     * 检查是否已设置用户
     * 
     * @return true表示已设置用户，false表示未设置
     */
    public static boolean hasUser() {
        return USER_THREAD_LOCAL.get() != null;
    }
}